#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void handler(int signo)
{
    cout << "子进程退出了，我收到了信号: " << signo << " 我是" << getpid() << endl;
}

int main()
{
    signal(SIGCHLD, handler);
    pid_t id = fork();
    if(id == 0)
    {
        while(true)
        {
            cout << "我是子进程: " << getpid() << endl;
            sleep(1);
        }
        exit(0);
    }

    // parent
    while(true)
    {
        cout << "我是父进程: " << getpid() << endl;
        sleep(1);
    } 

    return 0;
}




// #include <stdio.h>
// #include <signal.h>

// // 保持内存的可见性
// volatile int flags = 0;

// void handler(int signo)
// {
//     flags = 1;
//     printf("更改flags: 0->1\n");
// }

// int main()
// {
//     volatile const int a = 100;
//     signal(2, handler);

//     while(!flags);
//     printf("进程是正常退出的!\n");

//     return 0;
// }






// #include <iostream>
// #include <vector>
// #include <unistd.h>
// #include <signal.h>

// using namespace std;


// // 局限性，需要你对所有的信号进行捕捉
// std::vector<sighandler_t> handler;

// void Handler2()
// {
//     cout << "hello 2" << endl;
// }
// void Handler3()
// {
//     cout << "hello 3" << endl;
// }
// void Handler4()
// {
//     cout << "hello 4" << endl;
// }
// void Handler5()
// {
//     cout << "hello 5" << endl;
// }
// void Handler(int signo)
// {
//     switch (signo)
//     {
//     case 2:
//         Handler2();
//         break;
//     case 3:
//         Handler3();
//         break;
//     case 4:
//         Handler4();
//         break;
//     case 5:
//         Handler5();
//         break;
//     default:
//         break;
//     }
// }

// int main()
// {
//     signal(2, Handler);
//     signal(3, Handler);
//     signal(4, Handler);
//     signal(5, Handler);

//     return 0;
// }

// void handler(int signo)
// {
//     cout << "获取到一个信号，信号的编号是: " << signo << endl;
//     sigset_t pending;
//     // 增加handler信号的时间，永远都会处理2号信号
//     while(true)
//     {
//         cout << "." << endl;
//         sigpending(&pending);
//         for(int i = 1; i <= 31; ++i) 
//         {
//             if(sigismember(&pending, i))
//             {
//                 cout << "1";
//             }
//             else
//             {
//                 cout << "0";
//             }
//         }
//         cout << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     struct sigaction act, oact;
//     act.sa_handler = handler;
//     // act.sa_handler = SIG_IGN;
//     // act.sa_handler = SIG_DFL;
//     act.sa_flags = 0;
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask, 3);
//     sigaction(2, &act, &oact);

//     while(true)
//     {
//         cout << "main running" << endl;
//         sleep(1);
//     }

//     return 0;
// }